const _ = require("lodash");
const fs = require("fs");
const path = require("path");

// ✅ ESM 兼容
const esm = require("esm");
const requireModule = esm(module);

// ✅ 模块导入
const checkAccuracy = requireModule("./utils/checkAccuracy.js");
// 📦 项目依赖模块
const { readAllValues } = requireModule(
  "../awakened-potential/helpers/readAllValues.js"
);

// 📦 引入策略管理器（自动加载所有策略）
const { getAllStrategyNames, getStrategyByName } = require("./strategies/strategyManager");

// ✅ 读取历史开奖数据（m 为澳门）
const allValues = readAllValues("m");

// ✅ 是否启用滑动窗口
const useWindow = true;
// ✅ 窗口大小（每期分析多少历史数据）
const windowSize = 60;

// ✅ 所有可能的号码（01~49）
const allNumbers = Array.from({ length: 49 }, (_, i) =>
  (i + 1).toString().padStart(2, "0")
);

// ✅ 初始化统计变量
let predictResults = [];
let correct = 0;
let maxWrongStreak = 0;
let currentWrongStreak = 0;

// ✅ 获取所有策略名称
const strategyNames = getAllStrategyNames();

console.log("🤖 参与融合的策略数量：", strategyNames.length);

// ✅ 遍历开奖历史数据
allValues.forEach((item, index) => {
  // 构造窗口数据
  const temp = useWindow
    ? allValues.slice(Math.max(0, index - windowSize), index)
    : allValues.slice(0, index);

  if (temp.length === 0) return;

  // ✅ 融合多策略预测
  const voteMap = {}; // 号码出现次数记录

  strategyNames.forEach((name) => {
    const strategyFn = getStrategyByName(name);
    if (!strategyFn) return;

    const predicted = strategyFn(temp); // 返回32个号码
    predicted.forEach((num) => {
      voteMap[num] = (voteMap[num] || 0) + 1;
    });
  });

  // ✅ 根据投票数排序并选出前 32 个不重复号码
  const predictNumbers = Object.entries(voteMap)
    .sort((a, b) => b[1] - a[1]) // 降序
    .map(([num]) => num)
    .slice(0, 32);

  // ✅ 判断是否命中
  const isHit = checkAccuracy(predictNumbers, item.number);

  // ✅ 记录结果
  predictResults.push({
    index,
    date: item.time,
    actual: item.number,
    predict: predictNumbers,
    hit: isHit,
  });

  if (isHit) {
    correct++;
    currentWrongStreak = 0;
  } else {
    currentWrongStreak++;
    maxWrongStreak = Math.max(maxWrongStreak, currentWrongStreak);
  }
});

// ✅ 输出最终统计
const total = predictResults.length;
const accuracy = ((correct / total) * 100).toFixed(2);

console.log("🎯 策略融合（投票制）模式");
console.log("📅 总预测期数:", total);
console.log("✅ 命中次数:", correct);
console.log("📈 准确率:", accuracy + "%");
console.log("❌ 最大连续错误:", maxWrongStreak);
